home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / quarkpy / qopengl.py < prev    next >
Text File  |  2004-01-05  |  5KB  |  161 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. OpenGL manager.
  4. """
  5. #
  6. # Copyright (C) 1996-2000 Armin Rigo
  7. # THIS FILE IS PROTECTED BY THE GNU GENERAL PUBLIC LICENCE
  8. # FOUND IN FILE "COPYING.TXT"
  9. #
  10. #$Header: /cvsroot/quark/runtime/quarkpy/qopengl.py,v 1.5 2000/06/02 16:00:22 alexander Exp $
  11.  
  12. #
  13. # NOTE: this module is NEVER actually loaded before an OpenGL
  14. # view must be opened. To check if an OpenGL view is currently
  15. # opened DO NOT import qopengl; instead, check the value of
  16. # qbaselayout.BaseLayout.CurrentOpenGLOwner.
  17. #
  18.  
  19. import quarkx
  20. from qeditor import *
  21. from qdictionnary import Strings
  22. from qbasemgr import BaseLayout
  23. BaseLayout.CurrentOpenGLOwner = None
  24.  
  25.  
  26. #
  27. # Only one real OpenGL window is opened at a time;
  28. # all other map views actually render inside this window (invisibly)
  29. # and then copy the data to their own surface.
  30. #
  31. wnd = None
  32. glview = None
  33. offscreen = 0
  34.  
  35.  
  36. def open(editor, minx=0, miny=0, bkgnd=0, force=0):
  37.     # open the OpenGL window. If bkgnd=1, open it in the background.
  38.     # If bkgnd=2, force it in the background.
  39.  
  40.     global wnd, glview, offscreen
  41.     #quarkx.settimer(deadtest, None, 0)  # cancel this timer if pending
  42.     setup = quarkx.setupsubset(SS_GENERAL, "OpenGL")
  43.  
  44.     if wnd is not None:
  45.         if force or wnd.owner is not editor.form:
  46.             wnd.onclose = None
  47.             close()
  48.             onclose1(wnd)
  49.  
  50.     if wnd is None:
  51.         if setup["Warning2"]:
  52.             if quarkx.msgbox(Strings[-104], MT_WARNING, MB_YES|MB_NO) != MR_YES:
  53.                 raise quarkx.abort
  54.         floating = editor.form.newfloating(FWF_NOESCCLOSE, "OpenGL 3D")
  55.         view = floating.mainpanel.newmapview()
  56.         view.info = {"type": "3D"}
  57.         view.viewmode = "opengl"
  58.         setprojmode(view)
  59.         floating.onclose = onclose1   # so that onclose1 is called when the window is closed
  60.         wnd = floating
  61.         glview = view
  62.         clearviewdeps()
  63.         if bkgnd:
  64.             sw = quarkx.screenrect()[2]   # screen rightmost coordinate
  65.             wnd.windowrect = (sw+128, 0, sw+448, 200)
  66.             wnd.rect = (minx or 320, miny or 200)
  67.         else:
  68.             r = setup["WndRect"]
  69.             if safecheckrect(r):
  70.                 wnd.windowrect = r
  71.                 r = r[2:]
  72.             else:
  73.                 r = (320,200)
  74.             wnd.rect = (max(r[0],minx), max(r[1],miny))
  75.         offscreen = bkgnd
  76.         floating.show()
  77.         if bkgnd:
  78.             editor.form.macro("FOCU")    # gives the focus to the map editor window
  79.  
  80.     else:
  81.         if not offscreen and bkgnd==2:
  82.             r = wnd.windowrect
  83.             r = r[:2] + wnd.rect
  84.             setup["WndRect"] = r
  85.             sw = quarkx.screenrect()[2]   # screen rightmost coordinate
  86.             wnd.windowrect = (sw+128, 0, sw+448, 200)
  87.             r = r[2:]
  88.             offscreen = 1
  89.         elif offscreen and not bkgnd:
  90.             r = setup["WndRect"]
  91.             if not safecheckrect(r):
  92.                 r = (0,0,512,384)
  93.             wnd.windowrect = r
  94.             r = r[2:]
  95.             offscreen = 0
  96.         else:
  97.             r = wnd.rect
  98.         r = (max(r[0],minx), max(r[1],miny))
  99.         if r != wnd.rect:
  100.             wnd.rect = r
  101.             glview.waitforopengl()
  102.  
  103.  
  104. def grayimage(view, *args):
  105.     cv = view.canvas()
  106.     cv.brushcolor = 0x604040
  107.     w,h = view.clientarea
  108.     cv.rectangle(-1,-1,w,h)
  109.  
  110. def clearviewdeps():
  111.     # sets or resets the OpenGL view's parameters
  112.     v = glview
  113.     v.ondrop = v.onmouse = lambda *args: None
  114.     v.ondraw = grayimage
  115.     v.cursor = CR_ARROW
  116.  
  117. def safecheckrect(r):
  118.     sw = quarkx.screenrect()[2]   # screen rightmost coordinate
  119.     return type(r) is type(()) and r[0]<sw
  120.  
  121. def close():
  122.     # close the OpenGL window.
  123.     if wnd is not None:
  124.         wnd.close()
  125.  
  126.  
  127. #def deadtest(*reserved):
  128. #    # check if the OpenGL window is still in use
  129. #    if BaseLayout.CurrentOpenGLOwner is None:
  130. #        close()
  131.  
  132.  
  133. def onclose1(floating):
  134.     # called by the Delphi code when the window is closed
  135.     global wnd, glview
  136.     if BaseLayout.CurrentOpenGLOwner is not None:
  137.         BaseLayout.CurrentOpenGLOwner.releaseOpenGL()
  138.     wnd = glview = None
  139.     setup = quarkx.setupsubset(SS_GENERAL, "OpenGL")
  140.     if not offscreen:
  141.         r = floating.windowrect
  142.         r = r[:2] + floating.rect
  143.         setup["WndRect"] = r
  144.     setup["Warning2"] = ""
  145.  
  146.  
  147. def setupchanged(level):
  148.     if level>=5 and wnd is not None:   # change in the configuration dialog box
  149.         setprojmode(glview)
  150.  
  151. SetupRoutines.append(setupchanged)
  152.  
  153. # ----------- REVISION HISTORY ------------
  154. #
  155. #
  156. #$Log: qopengl.py,v $
  157. #Revision 1.5  2000/06/02 16:00:22  alexander
  158. #added cvs headers
  159. #
  160. #
  161. #